/*
倒过来考虑：每一步选择任意一个数并将其放到堆顶，询问 m 步后仍然有序的方案数

设 f(i, j) 表示 i 步后，堆顶的前 j 个元素恰为 [n - j + 1, n] 的方案数， ans = f(m, n)，初始值 f(0, n) = 1
有转移：
- j = 0,  (n - 1) * f(i, 0) -> f(i + 1, 0), f(i, 0) -> f(i + 1, 1)
- j = 1, 1 * f(i, 1) -> f(i + 1, 1), 1 * f(i, 1) -> f(i + 1, 2), (n - 2) * f(i, j) -> f(i + 1, 0)
- 1 < j < n, 1 * f(i, j) -> f(i + 1, j), 1 * f(i, j) -> f(i + 1, j + 1), 1 * f(i, j) -> f(i + 1, 1), (n - 3) * f(i, j) -> f(i + 1, 0)
- j = n, 1 * f(i, n) -> f(i, n), 1 * f(i, n) -> f(i, 1), (n - 2) * f(i, n) -> f(i + 1, 0)
*/

/*
妈的假完了，设 f(i, j) 表示 i 步后，不考虑前 [1, j] 这些元素后牌堆有序的方案数，初始值 f(0, 0) = 1，ans = f(m, 0)

这不就对完了？？？？

80pt是不是thuwc T1那种东西阿。，，我没补阿。。。。

矩阵好像是个下海森堡。不会是推通项啥的把。
*/
#include <bits/stdc++.h>

using namespace std;

const int MOD = 998244353;
inline int Plus(int a, int b) {return a + b >= MOD ? a + b - MOD : a + b; }
inline int Minus(int a, int b) {return a - b < 0 ? a - b + MOD : a - b; }
inline int ksm(long long a, int b) {
    long long r = 1;
    for(; b; b >>= 1, a = a * a % MOD)
        if(b & 1) r = r * a % MOD;
    return r;
}

const int N = 210 + 10;
int n, m;

struct matrix {
    int n, m, A[N][N];
    matrix(int _n = 0, int _m = 0) {
        n = _n, m = _m;
        for(int i = 0; i <= n; i ++) for(int j = 0; j <= m; j ++)
            A[i][j] = 0;
    }
};
matrix operator * (const matrix &lhs, const matrix &rhs) {
    matrix res(lhs.n, rhs.m);
    for(int i = 0; i <= res.n; i ++) for(int k = 0; k <= lhs.m; k ++)
        for(int j = 0; j <= res.m; j ++)
            res.A[i][j] = Plus(res.A[i][j], 1ll * lhs.A[i][k] * rhs.A[k][j] % MOD);
    return res;
}
matrix ksm(matrix a, int b) {
    matrix r(a.n, a.m);
    for(int i = 0; i <= r.n; i ++) r.A[i][i] = 1;
    for(; b; b >>= 1, a = a * a)
        if(b & 1) r = r * a;
    return r;
}

int main() {
    freopen("drama.in", "r", stdin);
    freopen("drama.out", "w", stdout);
    ios::sync_with_stdio(false), cin.tie(0);

    cin >> n >> m;
    if(n == 1) {
        cout << "1" << '\n';
        return 0;
    }
    matrix P(n, 0), T(n, n);
    P.A[0][0] = 1;
    for(int i = 0; i <= n - 1; i ++) {
        T.A[i][i] += i, T.A[i][0] ++, T.A[i][i + 1] ++;
        for(int j = 1; j <= i - 1; j ++) T.A[i][j] ++;
    }

    P = ksm(T, m) * P;
    cout << P.A[0][0] << '\n';

    return 0;
}